昨天我們簡單的使用陣列來練練習我們的CRUD,但在開發專案時怎麼可能只單純用陣列處理資料,通常是Web 開發時都一定會搭配DB來做使用,所以今天的話我就是要來使用之前叫的DB和昨天的CRUD 來做搭配使用給大家看
金的話就不會去實作創資料表的動作,就直接創好資料表,這裡我們資料庫的格式和程式碼我就先放放在下面
安裝Nuget 第三方套件
- Microsoft.EntityFrameworkCore.Tools
 - Pomelo.EntityFrameworkCore.MySql
 - Swashbuckle.AspNetCore
 
| 欄位名稱 | 欄位型態 | 描述 | 
|---|---|---|
| Id | int | 主鍵 | 
| Name | varchar(30) | |
| Phone | varchar(255) | 不重複 | 
| varchar(255) | 不重複 | |
| Age | int | 
using Microsoft.EntityFrameworkCore;
namespace DB_CRUD.Models
{
    public partial class UserContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public UserContext(DbContextOptions<UserContext> options) : base(options)
        {
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            OnModelCreatingPartial(modelBuilder);
        }
        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
namespace DB_CRUD.Models
{
    public class User
    {
        [Display(Name = "id")]
        public int Id { get; set; }
        [MaxLength(30)]
        [Display(Name = "name")]
        public string Name { get; set; }
        [Required]
        [Phone]
        [Display(Name = "phone")]
        public string Phone { get; set; }
        [Required]
        [EmailAddress]
        [Display(Name = "email")]
        public string Email { get; set; }
        [Required]
        [Range(1, 130)]
        [Display(Name = "age")]
        public int Age { get; set; }
    }
    public partial class UserContext : DbContext
    {
        partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>(entity =>
            {
                entity.HasIndex(e => e.Email).IsUnique();
                entity.HasIndex(e => e.Phone).IsUnique();
            });
        }
    }
}
相信大家在開發Web 時都依訂有寫過SQL 語法,但在ASP.NET CORE裡,為了讓model 與DB的關係更簡單、安全,所以ORM 的出現就很重要,ORM全名為 Object Relational Mapping(物件關聯對映),它是一個幫助使用者更簡便、安全的去從資料庫讀取資料,因為 ORM 的一個特性為透過程式語言,去操作資料庫語言
在ASP.NET CORE 應用程式中如果我們要適用資料庫的資料時,建議適用Entity Framework Core (EF Core) 來存取資料,EF Core 就是一種物件關聯式對應程式(ORM),可讓 .NET 開發人員保存要進出資料來源的物件
接著下面的範例就使用注入的UserContext,來做EF Core的基礎資料操作
private readonly UserContext _context;
public UsersController(UserContext context)
{
    _context = context;
}
新增資料
// POST: api/Users
[HttpPost]
public async Task<ActionResult<User>> PostUser(User user)
{
    _context.Users.Add(user);
    await _context.SaveChangesAsync();
    return CreatedAtAction("GetUser", new { id = user.Id }, user);
}
查詢資料
// GET: api/Users
[HttpGet]
public async Task<ActionResult<IEnumerable<User>>> GetUsers()
{
    return await _context.Users.ToListAsync();
}
// GET: api/Users/{id}
[HttpGet("{id}")]
public async Task<ActionResult<User>> GetUser(int id)
{
    var user = await _context.Users.FindAsync(id);
    if (user == null)
    {
        return NotFound();
    }
    return user;
}
更新資料
// PUT: api/Users/{id}
[HttpPut("{id}")]
public async Task<IActionResult> PutUser(int id, User user)
{
    if (id != user.Id)
    {
        return BadRequest();
    }
    _context.Entry(user).State = EntityState.Modified;
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!UserExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return NoContent();
}
private bool UserExists(int id)
{
    return _context.Users.Any(e => e.Id == id);
}
刪除資料
// DELETE: api/Users/{id}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteUser(int id)
{
    var user = await _context.Users.FindAsync(id);
    if (user == null)
    {
        return NotFound();
    }
    _context.Users.Remove(user);
    await _context.SaveChangesAsync();
    return NoContent();
}
當我們在使用EF CORE 來做資料庫查詢時,通常都會搭配之前講過的LINQ 的語法,LINQ 的語法會透過資料庫提供者解析成SQl 的語法。最後正確的使用LINQ To SQL 與否對於效能上的差異會非常大,所以上述的重點還是得非常謹慎去使用的
那我們今天的鐵人賽就先到這邊,我們就明天見啦~~~
參考資料: